import Observer from './Observer.js'
// 为传入属性对象添加 Observer -> __val__
function observe(value) {
  if (typeof value != 'object') return;
  let ob;
  if (typeof value.__ob__ !== 'undefined') {
    ob = value.__ob__
  } else {
    // 将 传入的对象属性 封装成 观察者对象
    // 内部 给 对象属性 添加 __ob__属性
    ob = new Observer(value)
  }
  return ob
}

// 为对象属性设置 getter/setter
export default function defineReactive(obj, key, val) {
  // 如果 属性值 在对象中已存在
  if (arguments.length === 2) {
    val = obj[key]; // 将 实例中的 属性值 传给形参变量，生成闭包
  }
  // 为当前属性生成 观察者对象
  let childObserver = observe(val)

  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get() {
      return val;
    },
    set(newVal) {
      // 如果新值 和 原值 一样，则返回
      if (newVal === val) {
        return;
      }
      val = newVal;
      // 设置的新值，如果是对象，也要添加 Observer
      childObserver = observe(newVal);
    }
  })
}

